home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (DO)
/
Nibble Volume 09, No. 07 (1988-07)(MicroSPARC)(Side B).zip
/
Nibble Volume 09, No. 07 (1988-07)(MicroSPARC)(Side B).do
/
COMPARER.txt
< prev
next >
Wrap
Text File
|
1996-12-24
|
9KB
|
556 lines
SBTL 'BASIC PROGRAM COMPARER'
*
* PROGRAM TO COMPARE THE CONTENTS
* OF TWO APPLESOFT PROGRAM FILES
*
* R.B.JORDAN
* RUAKURA A.R.C.
* NOV 1983
***********************************
ORG $8000
*
* ROUTINES AND POINTERS FOR
* THE CALLING PROGRAM.
*
*
* FILE DRIVE NOS.
* AT 32768
*
DRIVE DS 2
*
* ENTRY POINT
* AT 32770
*
ENTRY JMP INIT
*
* ONERR GOTO FIXER
* AT 32775
*
DS 32775-*
*
FIX PLA ;FETCH RETURN ADDRESS
TAY
PLA
LDX $DF ;GET TRUE STACK PNT
TXS
PHA ;PUT BACK RET ADR
TYA
PHA
RTS ;AND RETURN
*
PAGE
*
* TRACK SECTOR AND DATA
* STORAGE AREAS
*
DSECT
ORG $9000
F1TS DS 256
F2TS DS 256
F1LOBL DS 256
F1HIBL DS 256
F2LOBL DS 256
F2HIBL DS 256
DEND
*
* SCALARS AND EQUATES
*
F1TSPNT DFB 0 ;CURRENT FILE T/S
F2TSPNT DFB 0
F1LSTLO DFB 0 ;PREVIOUS EOL POINTERS
F1LSTHI DFB 0
F2LSTLO DFB 0
F2LSTHI DFB 0
F1PNTLO EQU $19 ;POINTERS TO CURRENT LINE
F1PNTHI EQU $1A
F2PNTLO EQU $1B
F2PNTHI EQU $1C
LINLEN1 DFB 0 ;LINE LENGTHS
LINLEN2 DFB 0
PFLAG1 DFB 0 ;IF MINUS PRINT
PFLAG2 DFB 0 ; THIS LINE
PNTTO EQU $6 ;GENERAL BASEPAGE POINTER
PNTFROM EQU $8
LINPRT EQU $ED24 ;BASIC PRINT A,X
OUTPUT EQU $DB5C ;BASIC O/P
CRDO EQU $DAFB ;BASIC CAR. RET.
FPNT DFB 0
CH EQU $24 ;MONITOR CHAR. HORIZ
YSAVE DFB 0
TKNTBL EQU $D0D0 ;BASIC TOKEN TABLE
SETINV EQU $FE80 ;MON. SET INVERSE
SETNORM EQU $FE84 ;AND NORMAL
CNTRLC EQU $83 ;KEYBOARD STUFF
KEYBD EQU $C000
KEYSTRB EQU $C010
LPNT DFB 0 ;ADR OF LAST MESSAGE
PAGE
*
* INITIAL PROGRAM ENTRY POINT
*
* READ BLOCK FROM EACH FILE
*
INIT LDA #$C ;SET T/S POINTER
STA F1TSPNT
STA F2TSPNT
LDA #0
JSR READTS
LDA #1
JSR READTS
*
* INITIALIZE DATA POINTERS
*
LDA #0 ;CLEAR ADR OF
STA LPNT ;LAST MESSAGE
LDA #1 ;PREVIOUS NEXT LINE
STA F1LSTLO ; POINTERS $801
STA F2LSTLO
LDA #8
STA F1LSTHI
STA F2LSTHI
*
LDA #2 ;DATA POINTERS TO 3RD
STA F1PNTLO ;BYTE OF FILE
STA F2PNTLO
LDA #<F1HIBL
STA F1PNTHI
LDA #<F2HIBL
STA F2PNTHI
*
LDY #0 ;COMPUTE
LDA (F1PNTLO),Y ;FIRST LINE LENGTHS
STA LINLEN1
DEC LINLEN1
LDA (F2PNTLO),Y
STA LINLEN2
DEC LINLEN2
PAGE
*
* MAIN LOOP STARTS HERE
*
* CHECK FOR END OF FILE1
*
MAIN LDY #0
LDA (F1PNTLO),Y ;CHECK LINE POINTER
CMP #0 ;FOR ZERO
BNE NOTEOF1 ;IN BOTH BYTES
INY
CMP (F1PNTLO),Y
BNE NOTEOF1
*
* EOF - PRINT F2 LINE
*
LDA #$80
STA PFLAG2
JMP CHF2
*
* DOES F1 LINE START IN HIBLOCK?
*
NOTEOF1 LDA #0
STA PFLAG2
LDA F1PNTHI
CMP #<F1HIBL
BNE CHF2 ;STILL IN LOBLOCK!
LDA #0 ;IN HIBLOCK PUSH
JSR READTS ; DOWN & READ
*
* CHECK FOR END OF FILE 2
*
CHF2 LDY #0
LDA (F2PNTLO),Y ;CHECK LINE POINTER
CMP #0 ;FOR ZERO
BNE NOTEOF2 ;IN BOTH BYTES
INY
CMP (F2PNTLO),Y
BNE NOTEOF2
*
* EOF - PRINT F1 LINE
*
LDA #$80
STA PFLAG1
JMP EOJOBCK
*
* DOES F2 LINE START IN HIBLOCK?
*
NOTEOF2 LDA #0
STA PFLAG1
LDA F2PNTHI
CMP #<F2HIBL
BNE EOJOBCK ;STILL IN LOBLOCK!
LDA #1 ;IN HIBLOCK PUSH
JSR READTS ; DOWN & READ
PAGE
*
* IF BOTH FILES AT EOF - END OF JOB
*
EOJOBCK LDA KEYBD ;CHECK FOR CNTRL-C
CMP #CNTRLC
BEQ WINDUP ;OPS HAD ENOUGH
LDA PFLAG1
AND PFLAG2
BPL NOTBOTH
*
* END OF COMPARISON
*
WINDUP BIT KEYSTRB ;KILL KEYBOARD
LDA #MESS5 ;SELECT FINISH TEXT
JSR MESSOUT
RTS
*
* IF ONLY ONE AT EOF LIST OTHER
*
NOTBOTH LDA PFLAG1
ORA PFLAG2
BMI LIST
*
* ARE LINE NOS. EQUAL?
*
LDY #3
LDA (F1PNTLO),Y ;HIBYTE CHK
CMP (F2PNTLO),Y
BCC LESS ;F1 < F2
BNE GREATER ;F1 > F2
DEY ;NOT SURE YET
LDA (F1PNTLO),Y ;LOBYTE CHK
CMP (F2PNTLO),Y
BCC LESS
BEQ EQUAL
*
* NOT EQUAL SET APPROP. FLAGS
*
GREATER LDA #$80
BNE SETFLGS
LESS LDA #$0
*
SETFLGS STA PFLAG2
EOR #$80
STA PFLAG1
JMP LIST
PAGE
*
* LINE NUMBERS EQUAL. CHECK LENGTHS
*
EQUAL LDA LINLEN1
CMP LINLEN2
BNE DIFFRNT
*
* SAME LENGTH. CHECK CONTENTS
*
LDY #4
MATLOOP LDA (F1PNTLO),Y
CMP (F2PNTLO),Y
BNE DIFFRNT
INY
CPY LINLEN1
BNE MATLOOP
*
* LINES THE SAME-SET FLAGS & SKIP
*
LDA #$80
STA PFLAG1
STA PFLAG2
JMP SKIP
*
* LINES DIFFERENT-SET FLAGS & LIST
*
DIFFRNT LDA #$80
STA PFLAG1
STA PFLAG2
*
* LIST LINES IF THEIR PFLAG IS TRUE
*
LIST BIT PFLAG1
BPL LIST2
LDY #F1PNTLO ;SELECT F1 LINE
LDA #MESS1 ;SET 'CHANGED'MESG
BIT PFLAG2
BMI *+4
LDA #MESS2 ;SET 'DELETED'MESG
JSR LISTLIN ;LIST IT
*
* SAME FOR LINE2
*
LIST2 BIT PFLAG2
BPL SKIP
LDY #F2PNTLO ;SELECT F2 LINE
LDA #MESS3 ;SET 'TO'MESG
BIT PFLAG1
BMI *+4
LDA #MESS4 ;SET 'ADDED'MESG
JSR LISTLIN ;LIST IT
PAGE
*
* SKIP LINES IF NECESSARY
*
SKIP BIT PFLAG1 ;SKIP LINE IN F1?
BPL SKIP2
LDY #0
LDA (F1PNTLO),Y ;SAVE START ADR OF
STA F1LSTLO ; NEXT LINE
INY
LDA (F1PNTLO),Y
STA F1LSTHI
*
LDA LINLEN1 ;ADVANCE LINE POINTER
CLC ; TO START OF NEXT
ADC F1PNTLO
STA F1PNTLO
LDA #0
ADC F1PNTHI
STA F1PNTHI
*
LDY #0 ;RECOMPUTE LINE LENGTHS
LDA (F1PNTLO),Y
SEC
SBC F1LSTLO
STA LINLEN1
*
* SKIP PROCESS FOR LINE2
*
SKIP2 BIT PFLAG2 ;SKIP LINE IN F2?
BPL ALLDUN
LDY #0
LDA (F2PNTLO),Y ;SAVE START ADR OF
STA F2LSTLO ; NEXT LINE
INY
LDA (F2PNTLO),Y
STA F2LSTHI
*
LDA LINLEN2 ;ADVANCE LINE POINTER
CLC ; TO START OF NEXT
ADC F2PNTLO
STA F2PNTLO
LDA #0
ADC F2PNTHI
STA F2PNTHI
*
LDY #0 ;RECOMPUTE LINE LENGTHS
LDA (F2PNTLO),Y
SEC
SBC F2LSTLO
STA LINLEN2
*
* END OF MAIN LOOP
*
ALLDUN JMP MAIN ;CONTINUE COMPARE
PAGE
*
* DOS RWTS COMMUNICATION
*
RWTS EQU $3D9
IB DFB 1
IBSLT DFB $60
IBDRV DFB 1
IBVOL DFB 0
IBTRK DFB 0
IBSECT DFB 0
IBDCT DW DCT
IBBUF DW 0
DW 0
IBCMD DFB 1
IBSTAT DFB 0
DFB 0
DFB $60
DFB 1
*
DCT DFB 0
DFB 1
DFB $EF
DFB $D8
*
* MOVE BUFFER DOWN ONE PAGE
*
READTS STA FPNT ;FILE ARG
ASL A
TAX
CLC ;COMPUTE ADR OF
ADC #<F1LOBL ;LOWER BLOCK
STA PNTTO+1
CLC
ADC #1 ;AND HI BLOCK
STA PNTFROM+1
LDA #0
STA PNTTO
STA PNTFROM ;LO ADRS =0
*
TAY
MOVE LDA (PNTFROM),Y
STA (PNTTO),Y ;MOVE IT DOWN
INY
BNE MOVE
*
DEC F1PNTHI,X ;DECREMENT POINTER
PAGE
*
* READ A TRACK SECTOR
*
LDA PNTFROM+1 ;SET RWTS TO HIBLOCK
STA IBBUF+1
LDA #0
STA IBBUF
*
LDX FPNT ; SET DRIVE
LDA DRIVE,X
STA IBDRV
*
TXA ;FIND NEW TRK / SECT
CLC
ADC #<F1TS
STA PNTTO+1
*
LDY F1TSPNT,X ;GET TRACK
LDA (PNTTO),Y
STA IBTRK
BEQ RWOK ;IF END OF T/S'S DON'T
INY
LDA (PNTTO),Y ;GET SECT
STA IBSECT
INY
TYA
STA F1TSPNT,X ;UPDATE T/S PNTR
*
LDA #<IB
LDY #>IB
JSR RWTS ;DO THE READ T/S
BCS ERREXIT ;IT KERASHED
RWOK RTS
*
ERREXIT PLA
PLA ;POP SUB ADR
LDA #MESS6
JSR MESSOUT ;PRINT ERROR MESS
RTS
PAGE
*
* SUBROUTINE TO PRINT MESSAGE AND
* LIST LINE IF REQUIRED
*
*
* MESSAGE OUTPUT
*
MESSOUT JSR SETINV ;INVERSE VIDEO
TAY
OUTLOOP LDA BASE,Y ;GET CHAR.
CMP #0 ;END OF MESSAGE?
BEQ DONE ;YES!
JSR OUTPUT ;NO - PRINT CHAR
INY ;NO! ADVANCE POINTER
BNE OUTLOOP ;BRANCH ALWAYS
DONE JSR SETNORM ;NORMAL VIDEO
JSR CRDO ;NEW LINE
RTS
*
* LINE OUTPUT
*
LISTLIN LDX 0,Y ;SAVE LINE ADR
STX PNTTO
LDX 1,Y
STX PNTTO+1
CMP LPNT ; SAME AS LAST MESS?
BEQ LISTIT
STA LPNT ;SAVE MESS ADR
JSR MESSOUT
*
LISTIT LDY #2
LDA (PNTTO),Y
TAX ;X=LINENO LO
INY
LDA (PNTTO),Y ;A=LINENO HI
STY YSAVE
JSR LINPRT ;PRINT LINENO
LDA #'
LSTLOOP LDY YSAVE
PRCHR JSR OUTPUT ;PRINT NONTOKEN
LDA CH
CMP #33 ;BEYOND COL 33?
BCC NOCR
JSR CRDO ;YES-PRINT CR
LDA #5
STA CH ;SPACE IN 5
NOCR INY
LDA (PNTTO),Y ;GET NEXT CHAR
BMI TOKEN ;A TOKEN!
BNE PRCHR ;NOT END OF LINE
*
JSR CRDO ;END OF LINE!
RTS ;AND BACK TO CALLER
PAGE
*
* IT'S A TOKEN - FIND IT
* IN TOKEN TABLE
*
TOKEN SEC ;TOKEN-$7F IS TOKEN
SBC #$7F ; NUMBER +1
TAX
STY YSAVE
LDY #<TKNTBL-$100 ;SET PNTR TO
STY PNTFROM+1 ; TOKEN TABLE-$100
LDY #>TKNTBL
STY PNTFROM
LDY #$FF ;TAB INDEX =$100-1
NXKEY DEX ;DECREMENT TOKEN NO.
BEQ PRKEY ;IF 0 FOUND TOKEN
NX1 JSR KEYCHR ;GET NEXT CHAR
BPL NX1 ;NOT END OF TOKEN
BMI NXKEY ;END OF TOKEN
*
* PRINT KEYWORD
*
PRKEY LDA #' ;BLANK BEFORE TOKEN
JSR OUTPUT
PR1 JSR KEYCHR ;GET TOKEN
BMI PR2 ;LAST?
JSR OUTPUT ;NO - PRINTIT
BNE PR1
PR2 JSR OUTPUT ;PRINT LAST
LDA #' ;BLANK AFTER TOKEN
BNE LSTLOOP ;CONTINUE PRINT
*
* GET CHAR FROM TOKENTABLE
*
KEYCHR INY ;MOVE TO NEXT
BNE KEY1
INC PNTFROM+1 ;BUMP HIBYTE
KEY1 LDA (PNTFROM),Y ;GET CHAR
RTS
PAGE
*
* TABLE OF MESSAGES
*
*
* PRINT LINE OF PROGRAM 1
*
MESS1 DFB $8D
ASC 'CHANGED'
DFB $00
*
MESS2 DFB $8D
ASC 'DELETED'
DFB $00
*
* PRINT LINE OF PROGRAM2
*
MESS3 ASC 'TO'
DFB $00
*
MESS4 DFB $8D
ASC 'ADDED'
DFB $00
*
* NORMAL WINDUP
*
MESS5 DFB $8D
ASC 'END OF FILES'
DFB $8D,$00
*
* ERROR WINDUP
*
MESS6 DFB $8D
ASC 'I/O ERROR'
DFB $8D,$00
*
BASE EQU DRIVE+$200
*
* END
*